// type annotation  类型注解, 我们来告诉TS变量是什么类型
let count2: number
count2 = 123

// type inference 类型推断，TS会自动的去尝试分析变量的类型
let countInference = 123

// 如果TS能够自动分析变量类型，我们就什么也不需要做了
// 如果TS无法分析变量类型的话，我们就需要使用类型注解

const firstNumber = 1
const secondNunber = 2
const total = firstNumber + secondNunber

function getTotal2(firstNumber: number, secondNumber: number) {
	return firstNumber + secondNunber
}

// 函数的返回值类型，void没有返回值，never表示函数永远不会执行完最后一步
let count // 此时count的类型为any
count = 132

// 对象类型，{}, Class, function, []
// const func = (str: string):number => {
//   return parseInt(str, 10)
// }
const func = (str: string) => {
	//优化：可以类型推断时，可以不写函数的返回值类型
	return parseInt(str, 10)
}
const func1: (str: string) => number = (str) => {
	//冒号后面是累心， 等号后面是实现
	return parseInt(str, 10)
}

let temp: number | string = 123
temp = '456'

const numberArr = [1, 2, 3]

const arr: (number | string)[] = [1, '2', 3]

const objectArr: { name: string; age: number }[] = [
	{
		name: 'yee',
		age: 18,
	},
]
// 可以使用：type alias 类型别名
type User = { name: string; age: number }
const userArr: User[] = [
	{
		name: 'yee',
		age: 18,
	},
]

class Teacher {
	name: string
	age: number
}
const teacherArr: Teacher[] = [
	{
		name: 'yee',
		age: 18,
	},
]

// 元组 tuple
const teacherInfo: (number | string)[] = ['Dell', 'male', 18]

const teacherInfo2: [string, string, number] = ['Dell', 'male', 18] // 元组，一个数组长度是固定的，里面数据的类型也是固定的，就可以使用元组
// csv 文件格式, 读取这类文件时，excel导出文件时等等可以使用元组，把类型固定
const teacherList: [string, string, number][] = [
	['dell', 'male', 19],
	['sun', 'female', 26],
	['jeny', 'female', 38],
]
